package toepen;

import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;

/**
 *  Een SpelRonde bestaat uit maximaal vier speelbeurten die achter elkaar
 *  gespeeld worden
 *   @author LucasD
 *   @modifiedBy Jonathan, Marcel
 */
// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.48737A25-9BA0-9527-F732-AC3A0614170F]
// </editor-fold> 
public class SpelRonde {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.9821D596-E533-69FB-22E4-D42CDFF232EB]
    // </editor-fold> 
    private Deelnemer deler;
    private Deelnemer klopper;
    private boolean isErGeklopt;

    /**
     *  Integer die bijhoudt welke spelronde dit is
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.67097B3C-220C-9C84-C33B-456C9C545964]
    // </editor-fold> 
    private int rondeNummer;
    private int strafPuntenLimiet;
    /**
     *  Integer die bijhoudt waar de stok stilstaat
     *  de stok wordt ook voor de hele klasse bruikbaar
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.67097B3C-220C-9C84-C33B-456C9C545964]
    // </editor-fold>
    private int counter = 0;
    private List<Kaart> stokGeschud;
    private Deelnemer winnaar;
    private Spel spel;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.08E0EF2E-C0B9-EDF1-BD91-32A8FDDB0AD3]
    // </editor-fold> 
    private LinkedList<Deelnemer> lijstDeelnemer;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.A0572DB8-2330-F339-A2DE-30E3AD997075]
    // </editor-fold> 
    private List<Hand> vuileWas;

    private boolean isVWToegestaan;
    private boolean isValsVWToegestaan;

    /**
     *  Constructor voor spelronde
     * @param spel
     * @param rondeNummer
     * @param deler
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.61C43655-B5EE-13F3-8615-66F7C8CB98B8]
    // </editor-fold> 
    public SpelRonde (Spel spel, int rondeNummer, Deelnemer deler) {
        lijstDeelnemer=spel.getDeelnemers();
        setDeler(deler);
        this.isVWToegestaan=spel.getIsVuileWasToegestaan();
        this.isValsVWToegestaan=spel.getIsValseVuileWasToegestaan();
        this.strafPuntenLimiet=spel.getStrafpuntLimiet();
        this.spel=spel;
         startSpeelBeurt();
    }

    private void initStok() {
       List stok=new ArrayList<Kaart>();
        for(Kleur kleur: Kleur.values()) {
            for (Waarde waarde : Waarde.values()) {
                stok.add(new Kaart(kleur, waarde));
            }
        }

        stokGeschud = stok;
        Collections.shuffle(stokGeschud);

    }

    /**
     * Begint de speelbeurt nadat gecontroleerd is of er nog genoeg actieve deelnemers zijn
     */
    public void startSpeelBeurt(){
        if (getActieveDeelnemers().size()>1){
            setinzet();
            initStok();
            this.counter = 0;
            delen();

            Deelnemer deelNemerAanDeBeurt;
            if (getDeler()==getActieveDeelnemers().getLast()){
                deelNemerAanDeBeurt = getActieveDeelnemers().getFirst();
            }
            else{
                deelNemerAanDeBeurt = getActieveDeelnemers().get(getActieveDeelnemers().indexOf(getDeler())+1);
            }

            SpeelBeurt.createSpeelBeurt(this, 0, deelNemerAanDeBeurt, getActieveDeelnemers());
        }
        else {
            //TODO: einde spel

               spel.eindeSpel(winnaar);
        }
    }


    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.2CB95C59-CF01-C3D1-A3B0-34D35254FB11]
    // </editor-fold> 
    /**
     * @return huidige rondenummer
     */
    public int getRondeNummer() {
        return rondeNummer;
    }

    /**
     * @return strafpuntlimiet van het spel
     */
    public int getStrafPuntLimiet() {
        return strafPuntenLimiet;
    }

    /**
     * Verandert het rondenummer
     * @param rondenummer
     */
    public void setRondeNummer(int rondenummer) {
        this.rondeNummer=rondenummer;
    }

    /**
     * @return of er geklopt is
     */
    public boolean getIsErGeklopt() {
        return isErGeklopt;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.BF326707-B5F0-F71D-71DB-2EAE381A5790]
    // </editor-fold>
    /**
     * Lijst me actieve deelnemers
     * @return lijst met actieve deelnemers
     */
    public LinkedList<Deelnemer> getActieveDeelnemers () {
        LinkedList<Deelnemer> actieveList = new LinkedList<Deelnemer>() ;
        for (int i = 0;i<lijstDeelnemer.size();i++) {
            if (lijstDeelnemer.get(i).getIsActief() != false) {
                actieveList.add(lijstDeelnemer.get(i));
            }
        }

        return actieveList;
    } 


    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.5B82FBA6-88E5-E530-83D1-9B190820984D]
    // </editor-fold> 
    /**
     * Retourneer alle deelnemers
     * @return
     */
    public List<Deelnemer> getDeelnemers() {
        return lijstDeelnemer;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.7B82857A-064D-2B3E-E568-093F99D8C5B3]
    // </editor-fold> 
    /**
     * Voeg een nieuwe deelnemer toe aan deze spelronde
     * @param nieuweDeelnemer
     */
    public void setDeelnemer(Deelnemer nieuweDeelnemer) {
        this.lijstDeelnemer.add(nieuweDeelnemer);
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.99B99D0B-DED7-68C2-E835-E36C3D713EDE]
    // </editor-fold> 
    /**
     * @return de persoon die de deler is
     */
    public Deelnemer getDeler() {
        return deler;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.D2165B4E-981F-7DAA-E594-B95F9E66659B]
    // </editor-fold> 
    /**
     * Bepaal welke deelnemer de deler is
     * @param deelnemer
     */
    public void setDeler(Deelnemer deelnemer) {
        this.deler = deelnemer;
    }

    /**
     * Haal de winnaar op
     * @return de deelnemer die gewonnen heeft of null als niemand gewonnen heeft
     */
    public Deelnemer getWinnaar() {
        return winnaar;
    }

    /**
     * Zet de winnaar
     * @param deelnemer
     */
    public void setWinnaar(Deelnemer deelnemer) {
        winnaar=deelnemer;
    }

    /**
     * Zet de klopper
     * @param deelnemer
     */
    public void setKlopper(Deelnemer deelnemer) {
        klopper=deelnemer;
    }

    /**
     * De persoon die geklopt heeft in deze ronde
     * @return de deelnemer die geklopt heeft of null als er niet geklopt is
     */
    public Deelnemer getKlopper() {
        return klopper;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.EE6681F2-FF45-8AC1-B732-AADEB63FEDBF]
    // </editor-fold> 
    /**
     * Verwijdert de deelmer die opgeeft
     * @param opgever deelnemer die opgeeft
     */
    public void verwijderDeelnemer(Deelnemer opgever) {
        lijstDeelnemer.remove(opgever);
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.81347D1A-EBCD-79B0-ABDC-6D4FF3E61182]
    // </editor-fold> 
    /**
     * Als een deelnemer past wordt deze inactief gezet
     * @param passer de deelnemer die inactief gezet wordt
     */
    public void setInActief(Deelnemer passer) {
         passer.setInactief();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.A961B47E-931A-89FB-CA98-75B97CC598CB]
    // </editor-fold>
    /**
     *  Roept de functie deelKaartaanDeelnemer aan voor iedere actieve deelnemer
     */
    public void delen () {   
        for (int i=0; i<getActieveDeelnemers().size(); i++)
        {
          deelKaartaanDeelnemer(getActieveDeelnemers().get(i));
        }        
    }

    /**
     * Deelnemer past met deze ronde
     * @param deelnemer die past
     */
    public void passen(Deelnemer deelnemer){
        deelnemer.setStrafPunten(deelnemer.getInzet());
        deelnemer.setInactief();
    }

    /**
     * Deelnemer gaat mee met de klopronde
     * @param deelnemer die meegaat
     */
    public void meegaan(Deelnemer deelnemer){
        int i = deelnemer.getInzet();
        i++;
        deelnemer.setInzet(i);
    }

    // Delen van kaarten aan een deelnemer los voor het delen van nieuwe kaarten bij bijv vuile was.



    private void deelKaartaanDeelnemer(Deelnemer deelnemer){
        List<Kaart> handTemp = new ArrayList<Kaart>();

        for (int j=0; j<4; j++) {
            handTemp.add(stokGeschud.get(counter));

            stokGeschud.remove(counter);
            counter++;
        }

        try {
            Hand hand  = new Hand(handTemp);
            deelnemer.setSpeelHand(hand);
        }
        catch (Exception ex) {
            System.out.println("Error: " + ex);
        }
    }

    /*
     * Initialiseer inzet aan het begin van spelronde.
     */
    private void setinzet(){
         for (int i=0; i<getActieveDeelnemers().size(); i++){
             getActieveDeelnemers().get(i).setInzet(1);
         }
    }
}

